package network2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoServer {

    // serversoket 就是外场拉人的大兄弟
    // socket就是内场服务的小姐姐
    // 外场拉人的小哥哥  只有一个.clientSocket则是每个客户端都分配一个
    private ServerSocket serverSocket = null;

    public TcpEchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true) {
            // 内场介绍的小姐姐 可以有很多个
            Socket clientSocket =
                    serverSocket.accept();
            processConnection(clientSocket);
        }
    }

    // 通过这个方法处理连接
    // 读取请求
    // 根据请求计算响应
    // 把响应返回客户端
    private void processConnection(Socket clientSocket) throws IOException {
        System.out.printf("[%s:%d] 客户端上线\n",clientSocket.getInetAddress().toString(),
                clientSocket.getPort());
        // try()这种写法,()中允许写多个流对象,使用;分隔
        try (InputStream inputStream =
                     clientSocket.getInputStream();
             OutputStream outputStream =
                     clientSocket.getOutputStream()) {
            Scanner scanner = new Scanner(inputStream);
            PrintWriter printWriter = new PrintWriter(outputStream);
            // 将字节流转成字符流,这样子处理是为了读取方便
            while (true) {
                // 读取请求 判断接下来有没有数据
                if (!scanner.hasNext()) {
                    // 读取的流到了结尾了(对端关闭了) 对端关闭连接,hasnext返回false
                    // 如果对端有数据1,hasNext就返回true,进一步就使用next来读出了
                    System.out.printf("[%s %d] 客户端下线\n",
                            clientSocket.getInetAddress(),
                            clientSocket.getPort());
                    break;
                }
                // 直接使用scanner读取一段字符串
                String request = scanner.next();
                // 根据请求计算响应
                String response = process(request);
                // 将响应写会给客户端 响应也是要带上换行的
                printWriter.println(response);
                printWriter.flush();
                System.out.printf("[%s %d] req %s res %s",
                       clientSocket.getInetAddress().toString(),
                        clientSocket.getPort(),
                        request,response);

                }
        } catch (IOException e) {
            e.printStackTrace();
        }  finally {
            clientSocket.close();
            // clinetSocket给一个连接提供服
            // 务,但是连接有很多个,所以需要进行关闭
        }

    }

    private String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        TcpEchoServer tcpEchoServer = new TcpEchoServer(9090);
        tcpEchoServer.start();
    }


}
